|
(******************************************************************************)
(**) ОТДЕЛ ПроБПФ+;
(******************************************************************************
* НАЗНАЧЕНИЕ:
* сравнение вычисления быстрого преобразования Фурье (БПФ) и
* вычисления обычного ПФ
* ПРИМЕЧАНИЯ:
* 1) во временной области формируем сигнал, состоящий из 200Гц синусоиды
* и небольной по амплитуде 2000Гц косинусоиды;
* 2) выполняем БПФ;
* 3) удаляем частотные составляющие выше 1000Гц;
* 4) выполняем обратное БПФ;
* 5) сравниваем БПФ и ПФ.
******************************************************************************)
ИСПОЛЬЗУЕТ
Матем ИЗ "...\Отделы\Числа\",
Компл ИЗ "...\Отделы\Числа\",
КомплВект ИЗ "...\Отделы\Числа\",
МатрВВ ИЗ "...\Отделы\Числа\",
Вывод ИЗ "...\Отделы\Обмен\";
ПОСТ
Отсчетов = 512; (* всего отсчетов сигнала (должно быть степенью 2) *)
Дискретизация = 22050;(* частота дискретизации, Гц *)
ВИД
Вещ = Матем.Вещ;
(******************************************************************************)
ЗАДАЧА f(t:Вещ):Вещ; (* сигнал в определенный момент времени *)
УКАЗ
ВОЗВРАТ Матем.sin(200*Матем.ПИ2*t) + 0.2*Матем.cos(2000*Матем.ПИ2*t)
КОН f;
(******************************************************************************)
ЗАДАЧА Голова;
ПЕР
i,частота:ЦЕЛ;
t,dt:Вещ;
вых:Компл.Вид;
вход,выход:КомплВект.Доступ;
УКАЗ
СОЗДАТЬ(вход, Отсчетов);
СОЗДАТЬ(выход,Отсчетов);
t:=0;
dt:=1/Дискретизация;
ОТ i:=0 ДО Отсчетов-1 ВЫП
Компл.алгВид(f(t),0,вход[i]);
t:=t+dt
КОН;
Вывод.Цепь("^Временной ряд на входе БПФ^");
МатрВВ.ВыводКомплВект("(%11.3e;%11.3e)^",вход^);
КомплВект.БПФ(вход^,выход^);
Вывод.Цепь("^Частотный ряд после БПФ^");
МатрВВ.ВыводКомплВект("(%11.3e;%11.3e)^",выход^);
(* убираем все частоты выше 1000 Гц *)
частота:=УЗК(ВШИРЦЕЛ(1000*Отсчетов/Дискретизация));
ОТ i:=0 ДО Отсчетов-1 ВЫП
ЕСЛИ ((i > частота) И (i < (Отсчетов ДЕЛИТЬ 2)))
ИЛИ
((i >= (Отсчетов ДЕЛИТЬ 2)) И (i < Отсчетов-частота))
ТО
выход[i]:=Компл.НОЛЬ
КОН
КОН;
КомплВект.ОБПФ(выход^,вход^);
Вывод.Цепь("^Временной ряд после фильтрации^");
МатрВВ.ВыводКомплВект("(%11.3e;%11.3e)^",вход^);
Вывод.Цепь("^Сравнение БПФ и ПФ^");
(* заполняем <вход> случайным образом *)
ОТ i:=0 ДО Отсчетов-1 ВЫП
Компл.алгВид(Матем.случ()*10000,
Матем.случ()*10000,вход[i])
КОН;
(* вычисление через БПФ *)
КомплВект.БПФ(вход^,выход^);
ОТ i:=0 ДО Отсчетов-1 ВЫП
(* вычисление через ПФ по определению *)
КомплВект.ПФ(i,вход^,вых);
(* сравнение результатов БПФ и ПФ *)
Вывод.ЧВещ("%14.5f %14.5f %14.5f %14.5f^",выход[i].x, вых.x,
выход[i].y, вых.y)
КОН
КОН Голова;
(******************************************************************************)
УКАЗ
Голова
КОН ПроБПФ.
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|